/*
    created: 2023/5/1
    filename: Hash.h
    author: 李东霖
    purpose：Hash的实现
    这里采用动态分配的方法来控制表长     
    结点链表我们采用的是不带头结点的链表 

*/

#ifndef _HASH_H_
#define _HASH_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define _uint32 __UINT32_TYPE__

//存放元素的结构体
typedef struct Elem
{
    //关键字
    _uint32 key;
    //存放的其他数据
    int val; 
}Element;

//哈希表结点的结构体  
typedef struct Node
{
    //数据元素
    Element elem;
    //指向下一个数据元素的指针
    struct Node* next;
}Node;

//哈希表  
typedef struct HashTable
{
    //表头
    struct Node* head;
    //表长
    _uint32 tablesize;
    //存放元素个数  
    _uint32  count;
}HashTable;

//操作  

//初始化哈希表  
//参数：初始化表长
//返回值：hash表的表头结点
HashTable* InitHashtable(const _uint32 tablesize);

//哈希函数  
//参数1：初始化过的哈希表  
//参数2：关键字  
//返回值：该关键字映射的哈希地址  
const _uint32 Hash(HashTable *hash,_uint32 key);

//查找  根据关键字来查找元素  
//参数1：初始化过的哈希表  
//参数2：关键字  
//返回值：该关键字对应的元素结点指针 
Node* Lookup(HashTable *hash,_uint32 key);

//删除  删除关键字指定的元素  
//参数1：初始化过的哈希表  
//参数2：关键字  
//返回值：-1：哈希表没有初始化 0-成功 1-失败   
int DeleteNode(HashTable *hash,_uint32 key);

//插入  根据关键字插入元素  
//参数1：初始化过的哈希表  
//参数2：关键字  
//返回值：-1：哈希表没有初始化 0-成功 1-失败  
int Insert(HashTable *hash,Element *elem);

//销毁哈希表
//参数1：初始化过的哈希表    
void DistroyHash(HashTable **hash);

//打印哈希表  
//打印的格式  同一哈希地址下的所有同义词  
//参数1：初始化过的哈希表  
void Display(HashTable* hash);

#endif//!_HASH_H_